<?php

namespace App\Services;


use App\Models\Mp;
use App\Models\TposInfo;
use EasyWeChat\MiniApp\Utils;
use EasyWeChat\OfficialAccount\Application;
use Illuminate\Support\Arr;
use Overtrue\EasySms\Support\Config;

class wxService
{

    private $config = [];
    private $mp=1;
    private $app='';
    private $code_key = 'sms_code_key_';

    public function __construct($config = '',$mp=1)
    {
        $this->mp=$mp;
        $this->app=$config;
        if ($config == 'miniapp' || $config = 'miniapppay') {
            $this->config = $this->miniappconfig();
        } else {
            $this->config = $this->gzhconfig();
        }

    }

    public function gzhconfig()
    {
        return [
            /**
             * 账号基本信息，请从微信公众平台/开放平台获取
             */
            'app_id' => config("wxconfig.app_key"),         // AppID
            'secret' => config("wxconfig.app_secret"),     // AppSecret
            'token' => 'your-token',          // Token
            'aes_key' => '',                    // EncodingAESKey，兼容与安全模式下请一定要填写！！！

            /**
             * OAuth 配置
             *
             * scopes：公众平台（snsapi_userinfo / snsapi_base），开放平台：snsapi_login
             * callback：OAuth授权完成后的回调页地址
             */
            'oauth' => [
                'scopes' => ['snsapi_userinfo'],
                'callback' => '/examples/oauth_callback.php',
            ],

            /**
             * 接口请求相关配置，超时时间等，具体可用参数请参考：
             * https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
             */
            'http' => [
                'timeout' => 5.0,
                // 'base_uri' => 'https://api.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用，根据不同的模块配置不同的 uri

                'retry' => true, // 使用默认重试配置
                //  'retry' => [
                //      // 仅以下状态码重试
                //      'http_codes' => [429, 500]
                //       // 最大重试次数
                //      'max_retries' => 3,
                //      // 请求间隔 (毫秒)
                //      'delay' => 1000,
                //      // 如果设置，每次重试的等待时间都会增加这个系数
                //      // (例如. 首次:1000ms; 第二次: 3 * 1000ms; etc.)
                //      'multiplier' => 3
                //  ],
            ],
        ];
    }

    public function miniappconfig()
    {
        $mps=Mp::find($this->mp);
        if (empty($mps)) {
            throw new \Exception('微信小程序配置有误');
        }
        return [
            'mpconfig' => $mps,
            /**
             * 账号基本信息，请从微信公众平台/开放平台获取
             */
            'app_id' => $mps->appid,         // AppID
            'secret' => $mps->AppSecret,     // AppSecret
            'token' => $mps->token,          // Token
            'aes_key' => $mps->EncodingAESKey,// 'bI88puuPqcZL1uGuPLlxGgAn486ts2RQvwKA1h8phRN',                    // EncodingAESKey，兼容与安全模式下请一定要填写！！！
            'mch_id' => $mps->mch_id,
            // 商户证书
            'private_key' => public_path('uploads') . $mps->care_key,
            'certificate' => public_path('uploads') . $mps->care_cert,

            // v3 API 秘钥
            'secret_key' => $mps->v3key,

            // v2 API 秘钥
            'v2_secret_key' => $mps->v2key,

            // 平台证书：微信支付 APIv3 平台证书，需要使用工具下载
            // 下载工具：https://github.com/wechatpay-apiv3/CertificateDownloader
            'platform_certs' => [
                // '/path/to/wechatpay/cert.pem',
            ],
            /**
             * 接口请求相关配置，超时时间等，具体可用参数请参考：
             * https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
             */
            'http' => [
                'throw' => true, // 状态码非 200、300 时是否抛出异常，默认为开启
                'timeout' => 30.0,
                // 'base_uri' => 'https://api.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用，根据不同的模块配置不同的 uri

                'retry' => true, // 使用默认重试配置
                //  'retry' => [
                //      // 仅以下状态码重试
                //      'http_codes' => [429, 500]
                //       // 最大重试次数
                //      'max_retries' => 3,
                //      // 请求间隔 (毫秒)
                //      'delay' => 1000,
                //      // 如果设置，每次重试的等待时间都会增加这个系数
                //      // (例如. 首次:1000ms; 第二次: 3 * 1000ms; etc.)
                //      'multiplier' => 3
                //  ],
            ],
        ];
    }

    public function run()
    {
        if ($this->app == 'miniapp') {
            return new \EasyWeChat\MiniApp\Application($this->config);
        } elseif ($this->app == 'miniapppay') {
            return new \EasyWeChat\Pay\Application($this->config);
        } elseif ($this->app == 'minimsg') {
            return new \EasyWeChat\OfficialAccount\Application($this->config);
        }
    }

    public function storageLogin($response)
    {
        $tposInfo=new TposInfo();
        $where=[];
        if(isset($response['openid'])){
            $where = Arr::add($where, 'openid', $response['openid']);
        }
        if(isset($response['unionid'])){
            $usertpos = $tposInfo->firstOrCreate($where,['unionid'=>$response['unionid'],'type'=>'wx']);
        }else{
            $usertpos = $tposInfo->firstOrCreate($where,['type'=>'wx']);
        }
        return $usertpos;
    }

    public function sendSubscribe($openid,$template_id,array $datain)
    {
        $app=$this->run();
        $api=$app->getClient();
        $data=[
            'access_token'=>$app->getAccessToken()->getToken(),
            'touser'=>$openid,
            'template_id'=>$template_id,
            'data'=>$datain,
        ];
        $res=$api->postJson('/cgi-bin/message/subscribe/send',$data);
        return $res;
    }


}
